package com.lxw.study;

import com.lxw.mutils.FileUtils;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DesignPattern {
    private static final List<String> creational = new ArrayList<>();
    private static final List<String> structural  = new ArrayList<>();
    private static final List<String> behavioral = new ArrayList<>();
    private static final Map<String,String> designPatternsMap = new HashMap<>();
    static {
        creational.add("抽象工厂模式（Abstract Factory）");
        creational.add("工厂方法模式（Factory Method）");
        creational.add("构建者模式（Builder）");
        creational.add("单例模式（Singleton）");
        creational.add("原型模式（Prototype Pattern）");

        structural.add("适配器模式（Adapter）");
        structural.add("桥接模式（Bridge）");
        structural.add("组合模式（Composite）");
        structural.add("装饰者模式（Decorator）");
        structural.add("外观模式（Facade）");
        structural.add("享元模式（Flyweight）");
        structural.add("代理模式（Proxy）");

        behavioral.add("责任链模式（Chain of responsibility）");
        behavioral.add("命令模式（Command）");
        behavioral.add("解释器模式（Interpreter）");
        behavioral.add("迭代器模式（Iterator）");
        behavioral.add("中介者模式（Mediator）");
        behavioral.add("备忘录模式（Memento）");
        behavioral.add("观察者模式（Observer）");
        behavioral.add("状态模式（State）");
        behavioral.add("访问者模式（Visitor）");
        behavioral.add("策略模式（Strategy Pattern）");
        behavioral.add("模板方法模式（Template Method Pattern）");

        designPatternsMap.put("单例模式", "保证一个类仅有一个实例，并提供一个全局访问点。");
        designPatternsMap.put("工厂方法模式", "定义一个创建对象的接口，但由子类决定要实例化的类是哪一个。");
        designPatternsMap.put("抽象工厂模式", "提供一个接口，用于创建相关或依赖对象的家族，而不需要指定具体类。");
        designPatternsMap.put("建造者模式", "将一个复杂对象的构建与它的表示分离，使同样的构建过程可以创建不同的表示。");
        designPatternsMap.put("原型模式", "通过复制现有对象来创建新对象，同时又保持了封装性。");
        designPatternsMap.put("适配器模式", "将一个类的接口转换成客户希望的另一个接口。");
        designPatternsMap.put("桥接模式", "将抽象部分与实现部分分离，使它们都可以独立变化。");
        designPatternsMap.put("组合模式", "将对象组合成树形结构以表示“部分-整体”的层次结构。");
        designPatternsMap.put("装饰者模式", "动态地给一个对象添加额外的职责，就扩展功能而言，装饰模式比生成子类更为灵活。");
        designPatternsMap.put("外观模式", "为子系统中的一组接口提供一个一致的界面，外观模式定义了一个高层接口，使得子系统更容易使用。");
        designPatternsMap.put("享元模式", "通过共享技术，有效地支持大量细粒度的对象。");
        designPatternsMap.put("代理模式", "为其他对象提供一种代理以控制对这个对象的访问。");
        designPatternsMap.put("责任链模式", "使多个对象都有机会处理请求，从而避免请求的发送者与接收者之间的耦合关系。");
        designPatternsMap.put("命令模式", "将请求封装成对象，使得可以用不同的请求对客户进行参数化。");
        designPatternsMap.put("解释器模式", "给定一个语言的文法，定义它的解释器，即一个解释公式的解释器。");
        designPatternsMap.put("迭代器模式", "提供一种方法顺序访问一个聚合对象中的各个元素，而又不暴露其内部的表示。");
        designPatternsMap.put("中介者模式", "用一个中介对象来封装一系列的对象交互，使各对象不需要显式地相互引用。");
        designPatternsMap.put("备忘录模式", "在不破坏封装的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。");
        designPatternsMap.put("观察者模式", "定义对象间的一种一对多的依赖关系，使得当一个对象状态改变时，所有依赖于它的对象都得到通知并被自动更新。");
        designPatternsMap.put("状态模式", "允许一个对象在其内部状态改变时改变它的行为。");
        designPatternsMap.put("策略模式", "定义一系列算法，封装每个算法，并使它们可以互换。");
        designPatternsMap.put("模板方法模式", "定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。");
        designPatternsMap.put("访问者模式", "表示一个作用于某对象结构中的各元素的操作，它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。");
    }
    private static final String path = "E:\\mynote\\notes\\md\\40\\设计模式\\";
    public static void main(String[] args) throws IOException {
        extracted(creational,"创建型");
        extracted(structural,"结构型");
        extracted(behavioral,"行为型");
    }

    private static void extracted(List<String> designPatterns,String type) throws IOException {
        for (String pattern : designPatterns) {
            List<String> list = new ArrayList<>();
            String patternName = pattern.split("（")[0];
            String title = "# 设计模式之"+ patternName;
            list.add(title);
            String tag = "### 标签:设计模式|"+type+"|"+patternName;
            list.add(tag);
            list.add("# "+pattern);
            list.add("# 定义");
            list.add(designPatternsMap.get(patternName));
            list.add("# 使用场景");
            list.add("# 主要角色");
            list.add("# 类图");
            list.add("# 示例代码");
            list.add("# 工作中遇到场景");
            File file = new File(path + "设计模式_"+type+"_"+patternName + ".md");
            if (!file.exists()) {
                System.out.println(file.getAbsoluteFile());
//            FileUtils.write2File(file,list);
            }
        }
    }
}
